Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Simple C + + XML Parser


.Aser♛

Rekomendowane odpowiedzi

Opublikowano

Wprowadzenie

 

Napisałem ten artykuł, bo byłem w potrzebie podstawowego parsera XML i nie mógł znaleźć jednego odpowiedniego dla moich potrzeb w Internecie (lekki parser masa).

 

Złożoność parsery tam raczej rozbrajanie i wymaga ogromnej ilości wiedzy, aby zrozumieć. Jeśli nie jesteś doświadczony programista C + +, to jest bardzo trudne do sensu kodu, a jeśli potem już napisać własny parser.

 

Napisałem funkcję parse, to zestaw klas do przechowywania danych analizowany, a przykładem tego, jak go używać (MFC dialog oparty o widoku drzewa). Ten parser jest bardzo prosty i ma tylko podstawowe funkcje, w celu podjęcia pracy, bez wymyślnych rzeczy. Istnieją pewne ograniczenia co do niego:

 

 

Parser rozpoznaje komentarze do pewnego stopnia.Błąd będzie generowany jeżeli znajdują się w pliku XML na zewnątrz węzła głównego.

Z dnia 29-wrzesień-2010, pewne wsparcie CDATA został dodany. To jest wciąż ograniczona (na przykład:

 

//<![CDATA[

 

wygeneruje błąd). Również Sekcje CDATA może istnieć tylko jako wartości węzłów. Extra realizacja może być łatwo dodawane, jeśli potrzebne, ale biorąc pod uwagę cel tego projektu, wolałbym zostawić tak, aby nie komplikować funkcji parse do tego stopnia, że ​​robi się trudne do zmodyfikowania.

Brak wsparcia dla przetwarzania instrukcji

Brak wsparcia dla DTD i podmiotów

 

 

 

Co nowego

 

Ten projekt jest zaprojektowane z myślą o prostocie, aby być w stanie przyswajać kod podstawowy szybko i łatwo i dodać do niej dodatkowe funkcje potrzebne każdego konkretnego zastosowania.

 

Zajęcia te dostarczają jedynie podstawową funkcjonalność, dlatego jest najbardziej lekkie parser od wszystkiego, co udało mi się znaleźć: 500 linii kodu dla parsera (w tym niektórych niewykorzystanych base64 funkcji, które mogą być usunięte w razie potrzeby), a kolejne 500 do drzewa binarnego konstruować. Jeżeli potrzebna jest większa funkcjonalność, to musi być dodany w celu spełnienia swoich potrzeb.

 

Jest bardzo łatwy do zrozumienia i pracy z tym kodem, jako podstawy do dalszego rozwoju.

 

Funkcja analizowania jest iteracyjny, to tylko raz przechodzi przez ciąg znaków XML, więc wydajność jest zadowalająca. Wymagania dotyczące pamięci są niskie, każdy obiekt przydziela, jak dużo pamięci faktycznie potrzebuje. Jest o wiele więcej do zrobienia, ale to nie jest celem tego projektu.

 

 

 

Jak To Działa?

 

Osobiście uważam, że nic innego nie trzeba powiedzieć o tym, ponieważ kod mówi sam za siebie, i został zaprojektowany, aby być łatwy do odczytania i zrozumieny. Jeżeli uznaje się za konieczne, mogę iść w niektórych szczegółach, w jaki sposób to działa i jak się wzbogacić.

 

 

Przy użyciu kodu

 

Radzenie sobie z formatu XML, są trzy klasy (oznaczona czerwoną kropką):

 

Cxml, CAttribute i CNode.

 

class_struct.JPG

 

 

Klasa Cxml jest jak koń roboczy dla tego projektu oraz zawiera funkcję analizy:

 

bool Cxml :: ParseString (_TCHAR * szXML);

 

 

Po analizowany, informacje muszą być przechowywane w pamięci w sposób łatwy w użyciu, zatem istnienie węzła i atrybutów klas.

 

Klasa Node ma strukturę drzewa, mając wskaźnik nadrzędny oraz listę dzieci. Zawiera również listę atrybutów.

 

Oprócz tych zajęć, istnieje zestaw Utils plików (. H &. Cpp), w których są pewne funkcje użytkowe.

 

 

 

Jak go używać?

 

Cóż, w celu wykorzystania go, trzeba wykonać następujące czynności:

 

dodać

 

#include "Cxml.h"

 

do projektu.

 

Tworzenie instancji klasy:

 

Cxml *oxml = new Cxml();

 

Przesuń wskaźnik do łańcucha zawierającego kod XML do funkcji analizy:

 

oxml->ParseString(szXML);

 

Po powrocie ParseString struktura XML są replikowane w klasie, a węzeł główny XML można pobrać z ...

 

oxml->GetRootNode();

 

 

Cechą szczególną jest tutaj. Bo przyjęło "ostatnią pierwsze wyszło" sposób, węzły będą organizowane w odwrotnej kolejności, niż znajdują się w oryginalnym ciąg XML.

 

Obiekt Node można nawigować przy użyciu jego funkcji publicznych. Pamiętaj jednak, że GetNextChild () zwiększa funkcja położenia licznika i nie wdrożyły sposób zresetować.

 

Najlepszym sposobem na zrozumienie wewnętrznego działania jest, aby projekt demo i przetestować sami. Trzeba będzie Visual Studio 2008 do kompilowania projektu, jak jest, bez rekonstrukcji. Jeśli zrekonstruować pamiętaj: to nie zostało przetestowane dla Unicode.

 

Pobierz projekt i go rozpakowauj. Skompilkuj. Uruchom go i naciśnij przycisk obciążenia.

 

 

exe_print_screen.JPG

 

 

Wybierz jeden z plików XML przewidzianych jako przykłady. Kliknij przycisk Otwórz.

 

tree_print_screen.JPG

 

 

To jest wynik dla jednego z plików XML usług.

 

[/left]


<CATALOG>
...
<PLANT>
<COMMON>Snakeroot</COMMON>
<BOTANICAL>Cimicifuga</BOTANICAL>
<MPCforum>Annual</MPCforum>
<LIGHT>Shade</LIGHT>
<PRICE>$5.63</PRICE>
<AVAILABILITY>071199</AVAILABILITY>
</PLANT>
<PLANT>
<COMMON>Cardinal Flower</COMMON>
<BOTANICAL>Lobelia cardinalis</BOTANICAL>
<MPCforum>2</MPCforum>
<LIGHT>Shade</LIGHT>
<PRICE>$3.02</PRICE>
<AVAILABILITY>022299</AVAILABILITY>
</PLANT>
</CATALOG>

64931698447324846581.png

 

Jestem .Aser♛ - Jeśli masz coś do mnie Pisz PW.

Wiem mam wielu wrogów i mam wielu przyjaciół.

Jestem WOJOWNIKIEM !.

Opublikowano

Ladnie to tak robic kopiuj wklej czyjas prace? Na dodatek przetlumaczona google translatorem? Akurat parsowanie XML nie jest rzecza specjalnie trudna. QXML czy Boost XmlParser ulatwiaja prace niesamowicie. Zczytanie danych sprowadza sie jedynie do otwarcia pliku i przelecenia node'ow przez NextStartElement i w razie czego zczytania danych. Takie rzeczy to banal. Gorzej jest z mapowaniem danych na klasy czy automatycznym generowaniem kolejnych idkow przy dodawaniu wezlow do pliku.

Opublikowano

@UP.

 

Przepraszam że nie podał źródła, ale zapomniałem....

64931698447324846581.png

 

Jestem .Aser♛ - Jeśli masz coś do mnie Pisz PW.

Wiem mam wielu wrogów i mam wielu przyjaciół.

Jestem WOJOWNIKIEM !.

  • 2 miesiące temu...

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...